/**
 * 2024.2.7 第七课 类和对象
 */
/*
一. 访问修饰限定符：private:私有的  protected:公有的  public:受保护的
二. this.成员变量  this.成员方法
三. 静态方法当中 不能调用非静态的成员变量/非静态的成员方法 只能有一个
 */
class  Student{
    /*
     * 成员属性/成员变量：定义在方法外部，类内部的变量
     * 成员变量
     * 1.静态成员变量
     * 2.普通成员变量
     */
    public  String name; //不是局部变量，而是成员变量 在没有初始化时，都会有一个默认值。
    //int 0   float=0.0f   double =0.0     引用类型 默认值都是null
    //boolean false        char  '\u0000'

    public int age;//public int age=9;//就地初始化 不建议写，除非有需求

    public static String classRoom;//static 静态的成员变量 不属于对象，属于类

    public Student(){//构造方法 无返回值 方法必须和类名一样
   /*this.name = "鼠标";
   this.age = 9;*/
        //System.out.println("Student(String,int)......");
        this( "鼠标",9);//只能出现在构造方法当中，
        // 调用当前类中其他构造方法 ，不能自己调用自己
        // 只能出现在当前构造方法的第一行
    }
    //快速生成构造方法
    //art +insert  鼠标右键-》generate-》Constructor
    public Student(String name,int age){
        this.name = name;
        this.age = age;
        System.out.println("Student(String,int)......");
    }
    //1.构造方法可以有多个
    //2.构造方法之间 构成重载关系

    /*
     * 静态代码块
     * 一般用来初始化静态成员
     * 类加载时就被调用
     */
    static {
        classRoom = "bit";//初始化
        System.out.println("这个是静态代码块！");//只执行一次
    }
    //构造代码块 类的里面 方法的外面
    {
        System.out.println("构造代码块！/实例代码块！");
    }
    //1.静态的先执行
//2.然后指向构造代码块
//3.再执行 对应的构造方法
//4.静态的 只执行一次
    /*
     * 成员方法：
     * 1.普通成员方法
     * 2.静态成员方法
     */
    public void eat(){
        System.out.println(this.name+"吃饭！");
    }
    public void show(){
        this.eat();
        System.out.println("姓名:"+this.name + " 年龄: "+this.age);
    }
    public static void func(){
        System.out.println("静态的!");
    }
}

public class Test  {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",10);
        student1.show();
        System.out.println("===========");
        System.out.println(student1);//输出地址
    }
    public static void main6(String[] args) {
        Student student1 = new Student("zhangsan",10);
        System.out.println("==============");
        Student student2 = new Student("lisi",4);

        System.out.println(Student.classRoom);
    }
    public static void main5(String[] args) {
       /* Student student1 = new Student("zhangsan",10);
        Student student2 = new Student("lisi",4);
        Student student3 = new Student("wangwu",98);*/
        //类名访问 就可以
        System.out.println(Student.classRoom);
        System.out.println(Student.classRoom);
        System.out.println(Student.classRoom);
        Student.func();
    }
    public static void main4(String[] args) {
        /*Student student1 = new Student();
        Student student2 = student1;*/

        //空指针异常 NullPointerException
        Student student3 = null;//不指向任何对象
        student3.show();
    }
    public static void main3(String[] args) {
        Student student = new Student();
        student.show();//调用构造方法

        Student stndent2 = new Student("孙悟空",19);
        stndent2.show();
    }
    public static void main2(String[] args) {
        Student student = new Student();
        student.name = "zhangsan";
        student.age = 10;
        student.show();
    }
    public static void main1(String[] args) {
        /*
         * 实例化 对象
         */
        Student student = new Student();
        student.name = "zhangsan";
        student.age = 10;
        student.show();
        System.out.println("=========");
        Student student2 = new Student();
        student.name = "lisi";
        student.age = 10;
        student.show();
    }
}